package com.fengye.common.annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.util.concurrent.TimeUnit;

/**
 * @author sunlei
 * @version 1.0
 * @date 2024/5/9 10:03:19
 * @description 限流注解（采用令牌桶算法实现），常用于高并发场景，比如秒杀场、抢票等场景
 */
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD})
public @interface RateLimit {
    /**
     * 资源的key，唯一
     * 作用：不同的接口，不同的流量控制
     * 如果key相同，则表示是同一个资源
     * 如果key是默认值
     */
    String key() default "";

    /**
     * 每秒最大的访问限制次数，默认10
     */
    double permitsPerSecond () default 10;

    /**
     * 获取令牌最大等待时间，默认500毫秒
     */
    long timeout() default 500;

    /**
     * 获取令牌最大等待时间,单位(例:分钟/秒/毫秒) 默认:毫秒
     */
    TimeUnit timeunit() default TimeUnit.MILLISECONDS;
}
